import pandas as pd
import numpy as np

data = 'https://www.gairuo.com/file/data/dataset/team.xlsx'
df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')

# 对每个字段分别指定
df = pd.read_excel(data, dtype={'team': 'string', 'Q1': 'int32'})
# 只保留数字类型列
df = df.select_dtypes(include='number')

df = pd.DataFrame({
    'A': [1,2,4],
    'B': [3,5,6]
}, index=['a', 'b', 'c'])

# 生成一个长度为100的列表
v = [1, 3, 5, 7, 9] * 20

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))

s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])


# 定义一个序列
arrays = [[1, 1, 2, 2], ['A', 'B', 'A', 'B']]
# 生成多层索引
index = pd.MultiIndex.from_arrays(arrays, names=('class', 'team'))


# 指定的索引是多层索引
pd.DataFrame([{'Q1':60, 'Q2':70}], index=index)

# 定义一个两层的序列
arrays = [[1, 1, 2, 2], ['A', 'B', 'A', 'B']]
# 转换为元组
tuples = list(zip(*arrays))
tuples
# [(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B')]
# 将元组转换为多层索引对象
index = pd.MultiIndex.from_tuples(tuples, names=['class', 'team'])
# 使用多层索引对象
pd.Series(np.random.randn(4), index=index)


_class = [1, 2]
team = ['A', 'B']
# 生成多层索引对象
index = pd.MultiIndex.from_product([_class, team],
                                   names=['class', 'team'])
# Series应用多层索引对象
pd.Series(np.random.randn(4), index=index)


# 索引
index_arrays = [[1, 1, 2, 2], ['男', '女', '男', '女']]
# 列名
columns_arrays = [['2019', '2019', '2020', '2020'],
                  ['上半年', '下半年', '上半年', '下半年',]]
# 索引转换为多层
index = pd.MultiIndex.from_arrays(index_arrays,
                                  names=('班级', '性别'))
# 列名转换为多层
columns = pd.MultiIndex.from_arrays(columns_arrays,
                                    names=('年份', '学期'))
# 应用到DataFrame中
df = pd.DataFrame([(88,99,88,99),(77,88,97,98),
                   (67,89,54,78),(34,67,89,54)],
                  columns=columns, index=index)
df

df.index # 索引，是一个MultiIndex


df.columns # 列索引，也是一个MultiIndex

# 查看行索引的名称
df.index.names
# FrozenList(['班级', '性别'])

# 查看列索引的名称
df.columns.names
# FrozenList(['年份', '学期'])


# 获取索引第2层内容
df.index.get_level_values(1)
# Index(['男', '女', '男', '女'], dtype='object', name='性别')
# 获取列索引第1层内容
df.columns.get_level_values(0)
# Index(['2019', '2019', '2020', '2020'], dtype='object', name='年份')

# 按索引名称取索引内容
df.index.get_level_values('班级')
# Int64Index([1, 1, 2, 2], dtype='int64', name='班级')
df.columns.get_level_values('年份')
# Index(['2019', '2019', '2020', '2020'], dtype='object', name='年份')

# 从图8-2的数据中查看一班的数据
df.loc[1]


df.loc[(1, '男'), '2020'] # 只显示2020年1班男生
df.loc[:, (slice(None), '下半年')] # 只看下半年，结果见图8-5
df.loc[(slice(None), '女'),:] # 只看女生，结果见图8-6
df.loc[1, (slice(None)),:] # 只看一班
df.loc[:, ('2020', slice(None))] # 只看2020年的数据




